use regex::Regex;
/**
 * 读取代码块，按行返回字符串
 * 在编译的时候，确定哪些是有问题的
 * */
#[derive(Debug)]
pub struct CljLinesFromString<'a> {
    index: usize,
    lines: Vec<&'a str>
}

impl <'a> CljLinesFromString<'a> {
    pub(crate) fn new(code: &'a str) -> Self {
        Self {index: 0, lines: Regex::new(r"\r?\n").unwrap().split(code).collect() }
    }

    /**
     * 读取下一行
     * */
    pub fn read_Line(&mut self) -> &str {
        if self.index < self.lines.len() {
            let s:&str = self.lines.get(self.index).unwrap();
            self.index += 1;
            return s;
        }
        return "";
    }

    /**
     * 清空数组 lines， 重置 index = 0
     * */
    pub fn close(&mut self) {
        self.lines.clear();
        self.index = 0;
    }
}

/**
 * 字符迭代
 * */
pub struct CljCharIterator<'a> {
    // 当前行
    lst: Vec<char>,
    // 当前字符
    c: char,
    // 当前字符串的 index
    i: i32,
    // 行数
    line_number: usize,
    // EOF
    has_seen_eof: bool,
    my_lines_from_string: CljLinesFromString<'a>
}

impl <'a> CljCharIterator<'a> {
    pub fn new(my_lines_from_string: CljLinesFromString<'a>) -> Self {
        Self {
            lst: Vec::new(),
            c: ' ',
            i: -1,
            line_number: 0,
            has_seen_eof: false,
            my_lines_from_string: my_lines_from_string
        }
    }

    // 读取下一个字符
    pub fn next(&mut self) -> bool {
        if self.i < 0 {
            self.lst = self.my_lines_from_string.read_Line().chars().collect();
            if self.lst.len() == 0 {
                self.has_seen_eof = true;
                return false;
            }
            self.line_number += 1;
            self.i += 1;
        }

        if self.i < self.lst.len() as i32 {
            self.c = self.lst[self.i as usize];
            self.i += 1;
        } else {
            self.i = -1;
            self.c = '\n';  // 行尾字符
        }
        return true;
    }

    // 获取当前字符
    pub fn my_current(&self) -> Result<char, &str> {
        if self.has_seen_eof == true {
            return Err("文件异常结束");
        }
        return Ok(self.c);
    }

    // 获取当前字符
    pub fn current(&self) -> char {
        // if self.my_current().is_ok() {
        //     return self.my_current().unwrap();
        // }
        // return Ok(self.c);
        return self.my_current().unwrap();
    }

    /**
     * 当前行号
     * */
    pub fn get_line_number(&self) -> usize {
        self.line_number
    }

    /**
     * 当前行 index
     * */
    pub fn get_line_index(&self) -> usize {
        self.i as usize
    }

}
















